package com.heshuo.basic.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.hibernate.Query;
import org.hibernate.Session;

import com.heshuo.basic.page.PageUtil;
  

public interface IBaseHibernateDAO <T, ID extends Serializable> {
	/**  
     * 保存指定实体类  
     *   
     * @param entityobj  
     *            实体类  
     */  
    public void save(T entity) ;   
  
    /**  
     * 删除指定实体  
     *   
     * @param entityobj  
     *            实体类  
     */  
    public void delete(T entity);
  
    /**  
     * 获取所有实体集合  
     *   
     * @param entityClass  
     *            实体  
     * @return 集合  
     */  
    public List<T> findAll(Class<T> entityClass) ;
  
    /**  
     * 更新或保存指定实体  
     *   
     * @param entity  
     *            实体类  
     */  
    public void saveOrUpdate(T entity) ;
  
    /**  
     * 查找指定ID实体类对象  
     *   
     * @param entityClass  
     *            实体Class  
     * @param id  
     *            实体ID  
     * @return 实体对象  
     */  
    public T findById(Class<T> entityClass, ID id);
  
    /**  
     * 查找指定ID实体类对象，默认对象  
     * @param id  
     *            实体ID  
     * @return 实体对象  
     */  
    public T findById(ID id);
  
    /**  
     * 查询指定HQL，并返回集合  
     *   
     * @param hql  
     *            HQL语句  
     * @param values  
     *            可变参数列表  
     * @return 集合  
     */  
    public List<T> find(String hql, Object... values) ;
    /**  
     * 查询指定HQL，并返回集合  
     *   
     * @param hql  
     *            HQL语句  
     * @param paramsMap  
     *            map参数列表  
     * @return 集合  
     */  
    public List<T> find(String hql, final Map paramsMap) ;
    /**
     * 通过sql查询
     * @param sql
     * @param paramsMap
     * @return
     */
    public List<T> findBySql(String sql,String obejctName,final Map paramsMap);
    /**  
     * 按照HQL语句查询唯一对象 
     *   
     * @param hql  
     *            HQL语句  
     * @param values  
     *            不定参数列表 
     * @return OBJECT对象  
     */  
    public T findUnique(final String hql, final Object... values);
    /**  
     * 按照HQL语句查询唯一对象 
     *   
     * @param hql  
     *            HQL语句  
     * @param paramsMap  
     *            map参数  
     * @return OBJECT对象  
     */  
    public T findUnique(final String hql, final Map paramsMap);
    /**  
     * 查找指定HQL并返回INT型  
     *   
     * @param hql  
     *            HQL语句  
     * @param values  
     *            不定参数列表  
     * @return INT  
     */  
    public int findInt(final String hql, final Object... values) ;   
    /**  
     * 查找指定HQL并返回INT型  
     *   
     * @param hql  
     *            HQL语句  
     * @param values  
     *            map参数列表  
     * @return INT  
     */  
    public int findInt(final String hql, final Map paramsMap) ; 
    /**  
     * 获取指定实体Class指定条件的记录总数  
     *   
     * @param entityClass  
     *            实体Class  
     * @param where  
     *            HQL的查询条件  
     * @param paramsMap  
     *            不定参数列表  
     * @return 记录总数  
     */  
    public int findTotalCount(Class<T> entityClass, final String where,   
            final Object... values) ;
    /**  
     * 获取指定实体Class指定条件的记录总数  
     *   
     * @param entityClass  
     *            实体Class  
     * @param where  
     *            HQL的查询条件,  
     * @param values  
     *            map参数列表  
     * @return 记录总数  
     */  
    public int findTotalCount(Class<T> entityClass, final String where,   
    		final Map paramsMap) ;
    /**  
     * 获取指定实体Class的记录总数  
     *   
     * @param entityClass  
     *            实体Class  
     * @return 记录总数  
     */  
    public int findTotalCount(Class<T> entityClass);
  
    /**  
     * 查找指定属性的实体集合  
     *   
     * @param entityClass  
     *            实体  
     * @param propertyName  
     *            属性名  
     * @param value  
     *            条件  
     * @return 实体集合  
     */  
    public List<T> findByProperty(Class<T> entityClass, String propertyName,   
            Object value) ;
  
    /**  
     * 模糊查询指定条件对象集合   
     * 用法：可以实例化一个空的T对象，需要查询某个字段，就set该字段的条件然后调用本方法  
     * 缺点：只能支持String的模糊查询，其他类型用HQL  
     *   
     * @param entity  
     *            条件实体  
     * @return 结合  
     */  
    public List<T> findByExample(T entity) ;
  
    /**  
     * merge的作用是new一个对象，如果该对象设置了ID，则这个对象就当作游离态(Detached)处理，
     * 如果没有设置ID的话，则这个对象就当作瞬态(Transient)处理
     * merge方法在执行之前会去缓存中找是不是有相应id的记录，
     * (也就是会有一条select语句，执行该语句的目的是为了判断该对象是否被修改了)  
     * 没有相当于insert,有则与已有对象合并，合并的方向是最新的对象
     * @param entity  
     * @return 持久后的实体类  
     */  
    public T merge(T entity) ;
  
    /**  
     * 将传入的对象状态设置为瞬态(Transient)
     * @param entity  
     *            实体  
     */  
    public void attachClean(T entity);
  
    /**  
     * 按HQL分页查询
     * @param pageUtil  
     *            页面对象  
     * @param hql  
     *            HQL语句  
     * @param values  
     *            不定参数列表  
     * @return 分页数据  
     */  
    public PageUtil<T> findByPage(final PageUtil<T> pageUtil, final String hql,   
            final Object... values) ;
    /**  
     * 按HQL分页查询
     * @param pageNo  
     *            当前页数
     * @param pageSize
     *              每页条目数量
     * @param hql  
     *            HQL语句  
     * @param paramsMap  
     *            map参数列表  
     * @return 分页数据  
     */
    public List<T> findByPage(int pageNo,int pageSize, String hql, Map paramsMap);
    /**  
     * 按SQL分页查询
     * @param pageNo  
     *            当前页数
     * @param pageSize
     *              每页条目数量
     * @param sql  
     *            SQL语句  
     * @param paramsMap  
     *            map参数列表  
     * @return 分页数据  
     */
    public List<T> findSqlByPage(int pageNo,int pageSize, String sql,String objectName, Map paramsMap);
    /**  
     * 按HQL分页查询
     * @param pageNo  
     *            当前页数
     * @param pageSize
     *              每页条目数量  
     * @param hql  
     *            HQL语句  
     * @param values  
     *            不定参数列表  
     * @return 分页数据  
     */  
    public List<T> findByPage(int pageNo,int pageSize, final String hql,   
            final Object... values) ;
    /**  
     * 按HQL分页查询
     * @param pageUtil  
     *            页面对象  
     * @param hql  
     *            HQL语句  
     * @param paramsMap  
     *            map参数列表  
     * @return 分页数据  
     */
    public PageUtil<T> findByPage(PageUtil<T> pageUtil, String hql, Map paramsMap);
    /**  
     * 根据查询条件与参数列表创建Query对象  
     *   
     * @param session  
     *            Hibernate会话  
     * @param hql  
     *            HQL语句  
     * @param objects  
     *            不定参数列表  
     * @return Query对象  
     */  
    public Query createQuery(Session session, String hql, Object... objects) ;
  
    
    /**  
     * 根据查询条件与参数列表创建Query对象  
     *   
     * @param session  
     *            Hibernate会话  
     * @param hql  
     *            HQL语句  
     * @param paramsMap  
     *            map参数列表  
     * @return Query对象  
     */  
    public Query createQuery(Session session, String hql, Map paramsMap) ;

	
}
